contents

CPU는 2의 보수(two's complement) 라는 기법을 사용하여 뺄셈을 덧셈 문제로 영리하게 변환하여 계산합니다. 덧셈과 뺄셈을 위한 복잡한 회로를 각각 따로 두는 대신, CPU는 고도로 최적화된 덧셈 회로를 재사용하여 두 연산을 모두 수행하는데, 이것이 훨씬 더 효율적입니다.

즉, A - B를 계산하기 위해 CPU는 실제로 A + (-B)를 계산합니다.


문제: 음수 표현하기

먼저, CPU는 이진수(binary)로 음수를 표현할 방법이 필요합니다. 표준적인 방법은 2의 보수입니다. 이는 산술 연산을 단순화하는 우아한 시스템입니다.

음수의 2의 보수 표현을 찾는 방법은 다음과 같습니다(예: 8비트를 사용하여 -5 찾기).

  1. 양수의 이진수로 시작합니다.
    • 숫자 5는 8비트 이진수로 0000 0101입니다.
  2. 모든 비트를 뒤집습니다. 이를 "1의 보수"라고 합니다.
    • 0000 01011111 1010이 됩니다.
  3. 1을 더합니다.
    • 1111 1010 + 11111 1011이 됩니다.

따라서, 8비트 2의 보수 시스템에서 1111 1011-5의 이진 표현입니다.


계산: 덧셈으로 위장하기 🧠

이제 CPU가 7 - 5를 어떻게 계산하는지 봅시다. 실제로는 7 + (-5) 연산을 수행할 것입니다.

  1. 두 숫자의 이진수를 구합니다.
    • 70000 0111입니다.
    • -5(방금 계산한 값)는 1111 1011입니다.
  2. 두 이진수를 더합니다.
  0000 0111   (7)
+ 1111 1011   (-5)
-----------
1 0000 0010
  1. 올림수 비트(overflow bit)를 버립니다. 덧셈 결과가 9비트가 된 것을 주목하세요. 우리는 8비트 시스템에서 작업하고 있으므로, 가장 왼쪽 비트(9번째 비트)는 올림수 비트입니다. 2의 보수 뺄셈에서 이 올림수 비트는 그냥 버려집니다.
  2. 결과. 남은 8비트는 0000 0010이며, 이는 숫자 2의 이진 표현입니다.

7 - 5 = 2라는 계산이 덧셈만으로 성공적으로 수행되었습니다.


하드웨어 구현 ⚙️

이 과정은 CPU의 특정 부분인 산술 논리 장치(ALU) 내부에서 처리됩니다.

ALU에는 이진수를 엄청난 속도로 더하도록 만들어진 가산기(adder) 라는 회로가 있습니다. CPU에 뺄셈을 지시하면 하드웨어 수준에서는 다음과 같은 일이 발생합니다.

  1. CPU의 제어 장치(Control Unit) 가 뺄셈 명령어를 받습니다.
  2. 두 숫자 AB를 ALU로 보냅니다.
  3. 제어 장치는 ALU에 "빼기" 연산을 수행하라고 지시합니다.
  4. ALU에는 전용 감산기(subtractor)가 없습니다. 대신, 숫자 B를 모든 비트를 뒤집는 간단한 NOT 게이트 회로로 보냅니다(2의 보수 첫 단계 수행).
  5. 그런 다음 A와 뒤집힌 B를 가산기 회로에 입력하고, 초기 "자리올림 입력(carry-in)" 비트를 1로 설정합니다(이는 2의 보수의 "1 더하기" 단계를 달성).
  6. 가산기 회로가 합계를 계산하면, 그 결과가 바로 A - B의 답이 됩니다.

이 기법을 사용함으로써 CPU는 별도의 복잡한 뺄셈 회로를 필요로 하지 않게 되어 칩의 공간을 절약하고 설계를 단순화할 수 있습니다.

references